#include <math.h> int matherr(x); struct exception *x; информация о математических исключениях
Описание.
Функция matherr обрабатывает ошибки, порожденные функциями математической библиотеки. Математические функции вызывают matherr , когда обнаружена ошибка. Пользователь может обеспечить различные объявления (определения) для функции matherr , выполняющие обработку специальных ошибок.
Если в математической процедуре возникла ошибка, matherr вызывается с указателем на следующую структуру (объявленную в <math.h>) как аргумент.
struct exeption { int type; char *name; double arg1, arg2, retval; };
Type определяет тип математической ошибки. Он может быть одним из следующих значений, объявленных в <math.h>
Значение Его смысл DOMAIN Ошибка области (определения) аргумента. SING Особенность аргумента. OVERFLOW Ошибка диапазона (области) переполнения UNDERFLOW Ошибка диапазона потери значимости. TLOSS Общая потеря значимости. PLOSS Частичная потеря значимости.
Элемент структуры name является указателем на строку, оканчивающуюся нулевым символом и содержащую имя функции, вызвавшей ошибку. Элементы структуры arg1 и arg2 определяют значения, вызвавшие ошибку. (Если задан только один аргумент, он запоминается в arg1 ). Для заданной ошибки по умолчанию возвращается значение retval . Это значение можно изменить. По возвращаемому значению можно определить, действительно или нет возникла ошибка. Если matherr возвращает 0, высвечивается сообщение об ошибке и errno устанавливается в приблизительное значение ошибки. Если matherr возвращает ненулевое значение, сообщение об ошибке не высвечивается и errno остается неизменной.
Возвращаемое значение.
Функция matherr в случае ошибки возвращает 0 и ненулевое значение, если действие верно и успешно выполнено.
Пример:
#include <math.h> #include <string.h> /* вылавливает ошибки в вызовах процедур log и log10. Если ошибка является результатом отрицательного аргумента (ошибка DOMAIN), возвращается log или log10 для абсолютного значения ар- гумента. Появляется сообщение об ошибке. Если ошибка является 0 аргументом или ошибка сгенерирована некоторой другой процедурой, действие выбирается по умолчанию */ int matherr(x) struct exception *x; { if (x->type==DOMAIN) { if(strsmp(x->name,"log")==0\0 { x->retval=log(-(x->arg1)); return(1); } else if(strsmp(x->name,"log10")==0) { x->retval=log10(-(x->arg1)); return(1); } } return(0); /* используется действие по умолчанию */ }